package api

import (
	"context"
	"fmt"
	"github.com/gin-gonic/gin"
	"gvb-server/Request"
	"gvb-server/core"
	"gvb-server/global"
	"gvb-server/logic"
	"gvb-server/utils"
	"net/http"
	"strconv"
	"time"
)

var UserLogic = logic.LogicGroup.UserLogic

// Users 用户列表
// @Tags 用户管理
// @Summary 用户列表
// @Description 用户列表
// @Param data query Request.UserRequest false "查询参数"
// @Produce application/json
// @Router /api/User [get]
// @Success 200 {object} utils.Response{data=utils.RList[models.Users]}	// 嵌套返回列表 注意范式结构体
func (U User) Users(c *gin.Context) {
	var s Request.UserRequest
	err := c.ShouldBindQuery(&s)

	r := global.RDB.Set(context.Background(), "mobile", "smsCode", 0) // 默认全局  正常
	fmt.Println("===============================================")
	fmt.Println("redis 返回：", r)

	//cr := core.SRdb.SelectDB(1).Set(context.Background(), "mobile", "smsCode", 0) // 选择DB  正常
	cr := core.SRdb.SelectDB(1).Set(context.Background(), "mobile", "smsCode", 0) // 选择DB  正常
	fmt.Println("==================cr=============================")
	fmt.Println("redis 返回cr：", cr)

	if err != nil {
		utils.Fail("", "参数错误", c)
		return
	}

	if s.Page == 0 {
		s.Page = utils.Page
	}
	if s.Size == 0 {
		s.Size = utils.Size
	}

	uRs, _, _, err := UserLogic.GetUserList(s)

	if err != nil {
		utils.Fail("", err.Error(), c)
		return
	}

	utils.Success(uRs, "", c)
}

// UsersExp 用户列表
// @Tags 用户管理
// @Summary 用户列表
// @Description 用户列表
// @Param data query Request.UserRequest false "查询参数"
// @Produce application/json
// @Router /api/User/exp [post]
// @Success 200 {object} *excelize.File	// 嵌套返回列表 注意范式结构体
func (U User) UsersExp(c *gin.Context) {
	var s Request.UserRequest
	err := c.ShouldBindJSON(&s)
	_, file, strExp, err := UserLogic.GetUserList(s)

	fmt.Println("============  file =============")
	fmt.Println(file)
	fmt.Println(s.Type)
	fmt.Println(err)

	fmt.Println("============  strExp =============")
	fmt.Println(strExp)

	if err == nil && s.Type == 1 {

		if strExp != "" {
			// -------------------------------------------------- 正常【更小 更快】 CSV 下载 ---------------------------------------------------
			c.Header("Content-Type", "text/csv")
			c.Header("Content-Disposition", "attachment;filename=export.csv")
			c.String(http.StatusOK, "\xEF\xBB\xBF"+strExp)
			return
		}

		if file != nil {
			// -------------------------------------------------- 正常 流一方式 下载 ---------------------------------------------------
			//c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
			//filename := fmt.Sprintf("Report_%v.xlsx", time.Now().Format("2006-01-02T15:04:05"))
			//c.Header("content-disposition", "attachment; filename="+filename)
			//// 将 Excel 文件写入 HTTP 响应
			//if err := file.Write(c.Writer); err != nil {
			//	utils.Fail("", "failed", c)
			//	return
			//}
			//utils.Success("", "success", c)
			//return

			// -------------------------------------------------- 正常 流二方式 下载 并保存文件 ---------------------------------------------------
			//获取当前时间
			//currentTime := time.Now()
			////格式化当前时间，生成文件夹名
			//folderName := "uploads/resume/" + currentTime.Format("20060102")
			////创建文件夹
			//err := os.MkdirAll(folderName, 0755)
			//if err != nil {
			//	fmt.Println("创建文件夹失败：", err)
			//	return
			//}
			//dateDir := folderName + "/your_file.xlsx"
			//err = file.SaveAs(dateDir)
			//if err != nil {
			//	fmt.Println("=====", err)
			//	global.Log.Fatal(err)
			//}
			//c.Header("Content-Disposition", "attachment; filename=your_file.xlsx")
			//c.Header("Content-Type", "text/plain")
			//
			//// 提供文件的路径，gin将自动读取并发送文件内容到客户端 【返回流文件给客户端】
			//c.File(dateDir) // 替换为你的文件路径
		}
	}
}

func (U User) DownloadHandler(c *gin.Context) {
	c.Header("Content-Disposition", "attachment; filename=example.xlsx")
	c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
	folderName := "uploads/resume/20250214/your_file.xlsx"

	// 返回 Excel 文件
	c.File(folderName)
}

// Login 用户登录
// @Tags 用户管理
// @Summary 用户登录
// @Description 用户登录
// @Param data query Request.UserLoginRequest true "输入参数"
// @Produce application/json
// @Router /api/login [post]
// @Success 200 {object} utils.Response{}
func (U User) Login(c *gin.Context) {
	// 邮箱，用户名l
	var s Request.UserLoginRequest
	err := c.ShouldBind(&s)

	if err != nil {
		utils.Fail("", err.Error(), c)
		return
	}

	r := UserLogic.UserLogin(s)

	if r.Code == utils.ERROR {
		utils.Success("", r.Msg, c)
		return
	}

	id, ok := c.Get("id")
	if ok {
		var TokenExpireDuration = time.Duration(global.Config.Jwt.Expires) * time.Hour

		i, _ := id.(string)

		r := global.RDB.Set(context.Background(), i+"_token", r.Data, TokenExpireDuration)
		//r := global.RDB.Set(context.Background(), id+"_token", r.Data.ResDataToken.Token, TokenExpireDuration)
		fmt.Println("===============================================")
		fmt.Println("redis 返回：", id)
		fmt.Println("redis 返回：", r)
	}

	// 用户email发送验证码
	code := utils.RandCode()
	utils.NewCode().Send("收件人邮箱地址", code)

	utils.Success(r.Data, "", c)
}

// UserCreate 新增修改
// @Tags 用户管理
// @Summary 新增修改
// @Description 新增修改
// @Param data body Request.UserCreateRequest true "多参数"
// @Produce application/json
// @Router /api/User [post]
// @Success 200 {object} utils.Response{}
func (U User) UserCreate(c *gin.Context) {
	var s Request.UserCreateRequest
	err := c.ShouldBindJSON(&s)
	if err != nil {
		msg := utils.GetValidMsg(err, &s)
		utils.Fail("", msg, c)
		return
	}

	fmt.Printf("================")
	fmt.Printf("头像%#v\n", s.Imgs)
	uRs := UserLogic.CreateUser(s)

	if uRs.Status == utils.ERROR {
		utils.Fail("", uRs.Msg, c)
		return
	}
	utils.Success("", uRs.Msg, c)
}

// UserDel 用户批量删除
// @Tags 用户管理
// @Summary 用户批量删除
// @Description 用户批量删除
// @Param data body Request.UserDelRequest true "ID必须"
// @Produce application/json
// @Router /api/User [DELETE]
// @Success 200 {object} utils.Response{}
func (U User) UserDel(c *gin.Context) {
	var s Request.UserDelRequest
	err := c.ShouldBindJSON(&s) // delete 方式删除

	fmt.Println("==================s.Ids==================")
	fmt.Println(s.Ids)
	if err != nil {
		msg := utils.GetValidMsg(err, &s)
		utils.Fail("", msg, c)
		return
	}

	uRs := UserLogic.DelUser(s)
	if uRs.Status == utils.ERROR {
		utils.Success("", uRs.Msg, c)
		return
	}

	utils.Success("", uRs.Msg, c)
}

// UsersInfo 用户信息
// @Tags 用户管理
// @Summary 用户信息
// @Description 用户信息
// @Param data body Request.UserDelRequest true "ID必须"
// @Produce application/json
// @Router /api/user/:id [get]
// @Success 200 {object} utils.Response{}
func (_ User) UsersInfo(c *gin.Context) {
	id := c.Param("id")
	if id == "" {
		utils.Fail("", "", c)
		return
	}
	nid, _ := strconv.Atoi(id)
	uRs := UserLogic.GetUserInfoById(nid)

	utils.Success(uRs, "", c)
}

// UsersMenus 用户菜单
// @Tags 用户管理
// @Summary 用户菜单
// @Description 用户菜单
// @Param data body Request.UserDelRequest true "ID必须"
// @Produce application/json
// @Router /api/user/menus/:id [get]
// @Success 200 {object} utils.Response{}
func (_ User) UsersMenus(c *gin.Context) {
	id := c.Param("id")
	if id == "" {
		utils.Fail("", "", c)
		return
	}
	nid, _ := strconv.Atoi(id)
	uRs := UserLogic.GetUserMenusById(nid)
	utils.Success(uRs, "", c)
}
